#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>

//这里写成一个具体的ip最好，localhost需要先进行DNS解析，如果解析失败了可能会直接退出了，后续程序不会被执行
const std::string host="localhost";
const std::string user="conn";
const std::string password="wk20050724";
const std::string DataBase="Connect";
int main()
{
    MYSQL* mysql = mysql_init(nullptr);
    mysql_set_character_set(mysql,"utf8");//设置成GB2312无法执行
    if(mysql == nullptr)
    {
        std::cerr << "初始化失败" << std::endl;
        return 1;
    }

    else std::cout << "初始化成功" << std::endl;
    mysql_real_connect(mysql,host.c_str(),user.c_str(),password.c_str(),DataBase.c_str(),3306,nullptr,0);
    // const std::string sql = "insert into user(name,phone) values('我时你时','546273427')";
    // const std::string sql = "update user set name='lihua' where id=6";
    // const std::string sql = "delete from user where id=6";
    // const std::string sql = "select * from account";//执行失败，不存在这个表
    const std::string sql = "select * from user";//执行失败，不存在这个表

    //当前无法解析select语句，下面我们来使用nysql接口来完成这个操作

    int n=mysql_query(mysql,sql.c_str());
    if(n!=0)std::cout<<"failed"<<std::endl;
    else
    {
        int ret = sql.find("select");
        if(ret!=std::string::npos&&ret==0)
        {
            //这是一条select语句
            MYSQL_RES* res=mysql_store_result(mysql);

            MYSQL_FIELD* field=mysql_fetch_field(res);
            unsigned int col=mysql_num_fields(res);
            int row=mysql_num_rows(res);
            
            for(int i=0; i<col; i++)
            {
                printf("%-15s", field[i].name); // 使用固定宽度格式化输出
            }
            std::cout << std::endl;
            std::cout << std::string(45, '-') << std::endl; // 添加分隔线

            MYSQL_ROW line;
            for(int i=0; i<row; i++)
            {
                line = mysql_fetch_row(res);
                for(int j=0; j<col; j++)
                {
                    printf("%-15s", line[j]); // 使用固定宽度格式化输出
                }
                std::cout << std::endl;
            }

            // free(res);//不需要free，否则会崩
        }
        else ;
    }
    //简单的模拟MySQL客户端的行为
    // if(mysql_real_connect(mysql,host.c_str(),user.c_str(),password.c_str(),DataBase.c_str(),3306,nullptr,0)!=nullptr)
    // {
    //     // sleep(10);
    //     std::string sql;
    //     while(true)
    //     {
    //         std::cout << "MySQL >>> ";
            
    //         if(!std::getline(std::cin,sql)||sql == "quit")
    //         {
    //             std::cout << "Bye" << std::endl;
    //             break;
    //         }
    //         int n = mysql_query(mysql,sql.c_str());
    //         if(n==0)
    //         {
    //             std::cout << sql << " excute success" << std::endl;
    //         }
    //         else 
    //         {
    //             std::cerr << sql << " excute failed" << std::endl;
    //         }
    //     }
    // }
    // else
    // {
    //     std::cerr << "connect failed" << std::endl; 
    //     return 2;
    // }

    mysql_close(mysql);
    return 0;
}
